%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Fonction de résolution du problème flux-free sur un patch
%
% Entr�es :
%
% sous-maillage : vecteur de coordonnées des noeuds du sous-maillage
% uh : [vecteur 4x1] extraction de la solution éléments finis
% epsilon : =1 sur le premier �l�ment du patch,
%           =-1 sur le deuxi�me �l�ment du patch,
%
% Sorties :
%
% ie : [matrice 4x4] matrice ie

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function [ U,F,K ] = Resolution_patch_fluxfree( patch , nPatch , donnees , nSousElements , maillage , uh ,poutre,sousPoutre)



if (patch~=1)*(patch~=nPatch)
    
    for epsilon=1:-2:-1      % dans chaque élément du patch
        
        
        sousDonnees=donnees ;
        sousDonnees.poutre.L = maillage(patch+(1-epsilon)/2)-maillage(patch-1+(1-epsilon)/2) ;
        sousDonnees.nombreElements = nSousElements ;
        
        sousMaillage = Mailleur_uniforme(sousDonnees) ;
        
        uhLocal = uh( ((patch-1+(1-epsilon)/2) -1 )*2+1 : (((patch-1+(1-epsilon)/2) -1 )*2+1) +3 ) ;
              
        Fe = Assemblage_F_element_fluxfree(sousMaillage,uhLocal,epsilon,poutre,sousPoutre,donnees);

        Ke = AssemblageRigidite(sousMaillage,sousDonnees.poutre);
        
        if epsilon==1
            FeG = Fe ;
            KeG = Ke ;
        else
            FeD = Fe ;
            KeD = Ke ;
        end
        
    end
    
    K = Assemblage_K_patch_fluxfree( KeG,KeD ) ;
    F = Assemblage_F_patch_fluxfree( FeG,FeD ) ;
    
    % Ajout des CL
    
    C = [ eye(2), zeros(2,size(K,1)-2) ];
    Kcl = [K , C' ; C , zeros(2) ] ;
    Fcl = [F ; 0 ; 0] ;
    
    Ucl = Kcl\Fcl ;
    U = Ucl(1:size(Ucl,1)-2);
%     pause
    
end

if patch==1
    epsilon=-1;
    
    sousDonnees=donnees ;
    sousDonnees.poutre.L = maillage(patch+(1-epsilon)/2)-maillage(patch-1+(1-epsilon)/2) ;
    sousDonnees.nombreElements = nSousElements ;
    
    sousMaillage = Mailleur_uniforme(sousDonnees) ;
    
    uhLocal = uh( ((patch-1+(1-epsilon)/2) -1 )*2+1 : (((patch-1+(1-epsilon)/2) -1 )*2+1) +3 ) ;
    
    F = Assemblage_F_element_fluxfree(sousMaillage,uhLocal,epsilon,poutre,sousPoutre,donnees) ;
    
    K = AssemblageRigidite(sousMaillage,sousDonnees.poutre) ;
    
    C = [ eye(2), zeros(2,size(K,1)-2) ];
    Kcl = [K , C' ; C , zeros(2) ] ;
    Fcl = [F ; 0 ; 0] ;
    
    Ucl=Kcl\Fcl ;
    
    U = Ucl(1:size(Ucl,1)-2) ;
  %  F = Ftot(1:size(Fcl,1)-2) ;
    
end

if patch==nPatch
    epsilon=1;
    
    sousDonnees=donnees ;
    sousDonnees.poutre.L = maillage(patch+(1-epsilon)/2)-maillage(patch-1+(1-epsilon)/2) ;
    sousDonnees.nombreElements = nSousElements ;
    
    sousMaillage = Mailleur_uniforme(sousDonnees) ;
    
    uhLocal = uh( ((patch-1+(1-epsilon)/2) -1 )*2+1 : (((patch-1+(1-epsilon)/2) -1 )*2+1) +3 ) ;
    
    F = Assemblage_F_element_fluxfree(sousMaillage,uhLocal,epsilon,poutre,sousPoutre,donnees) ;
    
    K = AssemblageRigidite(sousMaillage,sousDonnees.poutre) ;
    
%    Fe(size(Fe,1)-1) = Fe(size(Fe,1)-1) + donnees.F ;
    
    C = [ eye(2), zeros(2,size(K,1)-2) ];
    Kcl = [K , C' ; C , zeros(2) ] ;
    Fcl = [F ; 0 ; 0] ;
    
    Ucl=Kcl\Fcl ;
    
    U = Ucl(1:size(Ucl,1)-2) ;
    
end

end

